           BOI.12. (Campionatul de fotbal). Una din sarcinile Ministerului Sportu-
rilor dintr-o ar[ balcanic[ este de a organiza un campionat de fotbal cu n echipe
(numerotate de la 1 la n). Campionatul const[ din n etape (dac[ n este impar) sau
n-1 etape (dac[ n este par); orice dou[ echipe disput[ ntre ele un joc i numai
unul.
Problem[: 
Scriei un program care realizeaz[ o programare a campionatului.
Intrare: Num[rul de echipe n (2n24) va fi dat la intrarea standard (consol[).
Ieire: Ieirea este standard (ecran) sub forma unui tabel cu numere ntregi avnd n
linii. Al j-lea element din linia i este num[rul echipei care joac[ cu echipa i n
etapa j (evident dac[ i joac[ cu k n etapa j, atunci n tabel k joac[ cu i n
aceeai etap[). Dac[ echipa i este liber[ n etapa j, atunci al j-lea element al
liniei i este zero.
Exemple:
           i) Dac[ datele de intrare sunt:
3
atunci ieirea trebuie s[ aib[ forma:
2 3 0
1 0 3
0 1 2
           ii) Pentru intrarea:
4
ieirea va fi:
2 3 4 
1 4 3
4 1 2
3 2 1
=============================================
          BOI 12: (C[t[lin Frncu - Bucureti)
program meciuri;
  const MaxTeams=250;
  type ByteMatrix=array[1..MaxTeams,1..MaxTeams] of Byte;
  var RealN,N:Integer;
      A:ByteMatrix;
----------------------------------------------
procedure ReadData;
var i,j:Integer;
begin
   Write('Numarul de echipe (2-250): ');
   ReadLn(RealN);
   if RealN mod 2=1 then N:=RealN+1
        else N:=RealN;  { Se simuleaza un numar par de echipe}
   for i:=1 to N do
     for j:=1 to N do A[i,j]:=0;
end;
------------------------------------------------------------
procedure FindNextFree(K:Integer;var j:Integer);
{ Parcurge circular linia K a matricii pina cind gaseste un 0}
begin
  repeat
    Inc(j);
    if j=N then J:=1;
  until A[K,j]=0;
end;
----------------------------------------------------------------
procedure AddLine(K:Integer);
{ Stabileste meciurile echipei K. Aceasta are deja stabilite me-
ciurile cu echipele 1..K-1, iar pe cele cu K+1..N trebuie sa le
stabileasca astfel incit sa nu se suprapuna peste alte cereri}
var i,j:Integer;
begin
  j:=0;
  repeat Inc(j) until A[K,j]=K-1;
    { gaseste etapa in care a avut loc meciul K<->K-1 }
  FindNextFree(K,j);
  for i:=K+1 to N do
    begin
      FindNextFree(K,j);
      A[K,j]:=i; A[i,j]:=K;
    end;
end;
--------------------------------------------------------
procedure FillMatrix;
var i,j:Integer;
begin
  for i:=1 to N-1 do begin
   A[1,i]:=i+1; 
{ Prima echipa isi programeaza meciurile la alegere }
      A[i+1,i]:=1;
    end;
  for i:=2 to N-1 do AddLine(i);
  if RealN<>N then 
     for i:=1 to N-1 do
        for j:=1 to N-1 do
         if A[i,j]=N then A[i,j]:=0; { N este o "dummy-team" }
end;
--------------------------------------------------------
procedure WriteSolution;
var i,j:Integer;
begin
  for i:=1 to RealN do
    begin
      for j:=1 to RealN-1 do Write(A[i,j]:3);
      if RealN<>N then Write(A[i,RealN]:3);
      WriteLn;
    end;
end;
-------------------------------------------------------------
begin
  ReadData;
  FillMatrix;
  WriteSolution;
end.
------------------------------------------
